package com.xuecheng.base.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 此文件作为视频文件处理父类，提供： 1、查看视频时长 2、校验两个视频的时长是否相等
 */
public class VideoUtil
{

    String ffmpeg_path = "D:\\Program\\FFmpeg\\ffmpeg-7.0-full_build\\bin\\ffmpeg.exe";//ffmpeg的安装位置

    public VideoUtil(String ffmpeg_path) {
        this.ffmpeg_path = ffmpeg_path;
    }

    /**
     * 检查视频时间是否一致
     *
     * @param source
     * @param target
     * @return {@link Boolean}
     */
    public Boolean check_video_time(String source, String target) {
        String source_time = get_video_time(source);
        //取出时分秒
        source_time = source_time.substring(0, source_time.lastIndexOf("."));
        String target_time = get_video_time(target);
        //取出时分秒
        target_time = target_time.substring(0, target_time.lastIndexOf("."));
        if (source_time == null || target_time == null) {
            return false;
        }
        if (source_time.equals(target_time)) {
            return true;
        }
        return false;
    }

    /**
     * 获取视频时间(时：分：秒：毫秒)
     *
     * @param video_path
     * @return {@link String}
     */
    public String get_video_time(String video_path) {
        /*
        ffmpeg -i  lucene.mp4
         */
        List<String> commend = new ArrayList<>();
        commend.add(ffmpeg_path);
        commend.add("-i");
        commend.add(video_path);
        try {
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            //将标准输入流和错误输入流合并，通过标准输入流程读取信息
            builder.redirectErrorStream(true);
            Process p = builder.start();
            String outstring = waitFor(p);
            System.out.println(outstring);
            int start = outstring
                    .trim()
                    .indexOf("Duration: ");
            if (start >= 0) {
                int end = outstring
                        .trim()
                        .indexOf(", start:");
                if (end >= 0) {
                    String time = outstring.substring(start + 10, end);
                    if (time != null && !time.equals("")) {
                        return time.trim();
                    }
                }
            }

        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public String waitFor(Process p) {
        String result = "error";
        int exitValue = -1;
        StringBuffer outputString = new StringBuffer();
        try (InputStream in = p.getInputStream();
             InputStream error = p.getErrorStream()) {
            boolean finished = false;
            int maxRetry = 600;//每次休眠1秒，最长执行时间10分种
            int retry = 0;
            while (!finished) {
                if (retry > maxRetry) {
                    return "error";
                }
                try {
                    while (in.available() > 0) {
                        Character c = new Character((char) in.read());
                        outputString.append(c);
                        System.out.print(c);
                    }
                    while (error.available() > 0) {
                        Character c = new Character((char) in.read());
                        outputString.append(c);
                        System.out.print(c);
                    }
                    //进程未结束时调用exitValue将抛出异常
                    exitValue = p.exitValue();
                    finished = true;

                }
                catch (IllegalThreadStateException e) {
                    Thread
                            .currentThread()
                            .sleep(1000);//休眠1秒
                    retry++;
                }
            }

        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return outputString.toString();

    }

    public static void main(String[] args) throws IOException {
        String ffmpeg_path = "D:\\Program\\FFmpeg\\ffmpeg-7.0-full_build\\bin\\ffmpeg.exe";//ffmpeg的安装位置
        VideoUtil videoUtil = new VideoUtil(ffmpeg_path);
        String video_time = videoUtil.get_video_time("D:\\workspace-mine\\test.avi");
        System.out.println(video_time);
    }
}
